package club.service.impl;

import club.dao.AdoptAnimalMapper;
import club.pojo.AdoptAnimal;
import club.dao.PetMapper;
import club.dao.UserMapper;
import club.pojo.Pet;
import club.pojo.User;
import club.service.AdoptAnimalService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import club.service.UserService;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import java.util.ArrayList;
import java.util.List;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

@Service
@Transactional
public class AdoptAnimalServiceImpl implements AdoptAnimalService {

    @Resource
    private AdoptAnimalMapper adoptAnimalMapper;

    @Resource
    private UserMapper userMapper;

    @Resource
    private PetMapper petMapper;

    @Resource
    private UserService userService;

    /**
     * 查询所有符合条件的领养动物列表
     * @param userName 用户名，用于查询对应用户的领养记录
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @param state 领养状态，可选，用于筛选特定状态的领养记录
     * @return 包含领养动物信息的分页对象 PageInfo
     */
    @Override
    public PageInfo<AdoptAnimal> allAdoptAnimal(String userName, Integer pageNum, Integer pageSize, Integer state) {
        // 查询符合条件的用户列表
        List<User> users = userService.findByName(userName, state);
        // 提取用户id列表
        List<Integer> userIds = new ArrayList<>();
        for (User user : users){
            userIds.add(user.getId());
        }
        // 分页查询领养动物记录
        PageHelper.startPage(pageNum, pageSize);
        EntityWrapper wrapper = new EntityWrapper();
        if (state != null){
            wrapper.eq("state", state);
        }
        if (users != null){
            wrapper.in("userId", userIds);
        }
        List<AdoptAnimal> list = adoptAnimalMapper.selectList(wrapper);
        // 关联用户和宠物信息到领养动物对象中
        for(AdoptAnimal a : list){
            User u = userMapper.selectById(a.getUserId());
            a.setUser(u);
            Pet pet = petMapper.selectById(a.getPetId());
            a.setPet(pet);
        }
        // 封装为分页对象
        PageInfo<AdoptAnimal> pageInfo = new PageInfo<>(list);
        return pageInfo;
    }

    /**
     * 创建新的领养申请记录
     * @param adoptAnimal 领养动物对象，包含领养相关信息
     * @return 插入操作影响的行数，通常为1
     */
    @Override
    public Integer create(AdoptAnimal adoptAnimal) {
        return adoptAnimalMapper.insert(adoptAnimal);
    }

    /**
     * 根据领养时间查询领养记录
     * @param adoptTime 领养时间，可用于模糊查询
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @return 包含领养动物信息的分页对象 PageInfo
     */
    @Override
    public PageInfo<AdoptAnimal> all(String adoptTime, Integer pageNum, Integer pageSize) {
        // 分页查询领养记录
        PageHelper.startPage(pageNum, pageSize);
        EntityWrapper<AdoptAnimal> wrapper = new EntityWrapper<>();
        if (adoptTime != null && !"".equals(adoptTime)){
            wrapper.like("adoptTime", adoptTime);
        }
        // 查询状态为1的领养记录（假设状态1表示已领养）
        List<AdoptAnimal> list = adoptAnimalMapper.selectList(wrapper.eq("state", 1));
        // 关联用户和宠物信息到领养动物对象中
        for(AdoptAnimal a : list){
            Pet pet = petMapper.selectById(a.getPetId());
            a.setPet(pet);
            User user = userMapper.selectById(a.getUserId());
            a.setUser(user);
        }
        // 封装为分页对象
        PageInfo<AdoptAnimal> pageInfo = new PageInfo<>(list);
        return pageInfo;
    }

    /**
     * 更新领养申请的状态
     * @param id 领养申请记录的ID
     * @param state 新的领养状态
     * @return 更新操作影响的行数，通常为1
     */
    @Override
    public int update(Integer id, Integer state) {
        // 根据ID查询领养申请记录
        AdoptAnimal adoptAnimal = adoptAnimalMapper.selectById(id);
        // 更新领养状态
        adoptAnimal.setState(state);
        // 执行更新操作
        Integer result = adoptAnimalMapper.updateById(adoptAnimal);
        return result;
    }
}